package network.protocol;

import com.alibaba.fastjson.annotation.JSONField;
import common.constant.ResultCode;
import lombok.Getter;
import lombok.Setter;

/**
 * 统一API响应结果封装类
 * 支持链式调用，提供丰富的静态工厂方法
 */
@Setter
@Getter
public class Response<T> {
    /**
     * 状态码：200成功，其他失败
     */
    private int code;

    /**
     * 提示信息
     */
    private String msg;

    /**
     * 响应数据
     */
    private T data;

    /**
     * 时间戳（毫秒）
     */
    private long timestamp;

    // 私有构造器，强制使用静态工厂方法
    private Response() {
        this.timestamp = System.currentTimeMillis();
    }

    /**
     * 创建成功结果（无数据）
     */
    public static <T> Response<T> success() {
        return success(null);
    }

    /**
     * 创建成功结果（带数据）
     */
    public static <T> Response<T> success(T data) {
        Response<T> response = new Response<>();
        response.code = ResultCode.SUCCESS.getCode();
        response.msg = ResultCode.SUCCESS.getMessage();
        response.data = data;
        return response;
    }

    /**
     * 创建失败结果（默认错误码）
     */
    public static <T> Response<T> error() {
        return error(ResultCode.ERROR.getMessage());
    }

    /**
     * 创建失败结果（自定义错误信息）
     */
    public static <T> Response<T> error(String message) {
        return error(ResultCode.ERROR.getCode(), message);
    }

    /**
     * 创建失败结果（自定义错误码和信息）
     */
    public static <T> Response<T> error(int code, String message) {
        Response<T> response = new Response<>();
        response.code = code;
        response.msg = message;
        return response;
    }

    /**
     * 创建失败结果（使用预定义的错误码枚举）
     */
    public static <T> Response<T> error(ResultCode resultCode) {
        return error(resultCode.getCode(), resultCode.getMessage());
    }

    /**
     * 创建失败结果（使用预定义的错误码枚举，自定义信息）
     */
    public static <T> Response<T> error(ResultCode resultCode, String customMessage) {
        Response<T> response = new Response<>();
        response.code = resultCode.getCode();
        response.msg = customMessage;
        return response;
    }

    /**
     * 链式设置数据
     */
    public Response<T> data(T data) {
        this.data = data;
        return this;
    }

    /**
     * 链式设置消息
     */
    public Response<T> msg(String msg) {
        this.msg = msg;
        return this;
    }

    /**
     * 链式设置代码
     */
    public Response<T> code(int code) {
        this.code = code;
        return this;
    }

    /**
     * 判断是否成功
     */
    @JSONField(serialize = false) // 序列化时忽略这个字段
    public boolean isSuccess() {
        return this.code == ResultCode.SUCCESS.getCode();
    }

    /**
     * 判断是否失败
     */
    @JSONField(serialize = false)
    public boolean isError() {
        return !isSuccess();
    }

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                ", timestamp=" + timestamp +
                '}';
    }
}